我们已经完成了第一个关卡,包括基本玩法,一些声音,图像和粒子。
然而,当player死掉后,游戏仍然在进行,并不能重新开始。此外,当你加载它的时候,游戏会直接开始,我们非常清楚,在哪里我们需要使用菜单来控制游戏。
Damien:直接的讲:菜单和GUI在游戏并没有乐趣,你通常可以用一个非常基础的GUI框架(没有也行)。
你会花不少时间,但结果是…玩家会非常快的跳过菜单
Matthieu:不同于很多游戏开发者,我并不同意上面的观点,创建一个好的游戏GUI不是一件简单事情,但它是有好处且有趣的。然后,创建菜单需要好的工具和一些实用的设计(就像应用界面)
但是,怎么说呢:一个好的菜单很可能是不可见的,因为玩家可能根本没有注意到它就退出了。
从Unity 4.6开始,UI tools已经升级了,现在可以制作一些非常时髦的菜单。
在本教程里,我们不会制作一个复杂的GUI,但我们会做个基础的。
(右键单击保存图片)
(右键单击保存图片)
导入这些素材到项目里,你可以把它们放到"sprites"里的"Menu"下。否则"background"将会把之前的文件覆盖掉。
至于按钮,我们将使用标准库里的。
几乎所有的游戏都有标题界面,这是玩家在开始游戏前呆的地方。
Damien:一些是令人惊叹和值得留念的:Megaman(洛克人), Metal Slug(合金弹头)… (我是一个标题屏幕的粉丝)
我们将制作的可能没有样的令人惊叹,但是...简单!
首先,创建一个新的场景:
- "File" -> "New scene".
- 保存它到"Scenes"目录里,并命名为"Menu".
小巧门:你也可以使用
cmd + N
(OS X) 或者ctrl + N
(Windows) 快捷键
我们的标题界面由以下内容组成:
- 一个背景图片
- 一个LOGO
- 一个脚本来显示按钮
让我们来制作背景,使用专用菜单"Game Object" -> "UI" -> "Image",Unity会创建所有需要的对象和组件。
- 将新建的UI对象,命名为"Background"
- 将anchor设置为 horizontally & vertically
- 确保"Top", "Botton", "Left"和"Right"的值为0
你应该有了一个全屏的背景,不要担心你使用的分辨率。
(上图为16:9,如果你的效果和它不同,将Game预览里的画面比例置为16:9即可)
现在,同背景一样,添加logo:
- 设置它的大小为512 * 512
- 勾上"Preserve Aspect"
- 设置anchor为"middle & center (居中)"
当然,你可以添加你的名字,介绍,笑话或动画。菜单是自由的,只是要考虑到,玩家想尽快的开始游戏。
现在,我们将添加按钮,并使用脚本来开始游戏。
使用菜单创建一个新按钮("Game Object -> UI -> Button")。将它放到标题界面上,试着改变按钮文本!:)
就是下面这样:
在"Scripts"目录下创建"MenuScript"脚本,将它添加到一个新的游戏空对象里(像之前一样,叫"Scripts")
using UnityEngine;
/// <summary>
/// Title screen script
/// </summary>
public class MenuScript : MonoBehaviour
{
public void StartGame()
{
// "Stage1" is the name of the first scene we created.
Application.LoadLevel("Stage1");
}
}
译者注:在Unity 2018.3里,Application.LoadLevel(string);方法已过时,建议使用SceneManager.LoadScene(string);方法,但要使用SceneManager,需要先导入UnityEngine.SceneManager包,所以新的脚本是
using UnityEngine;
using UnityEngine.SceneManagement;
public class MenuScript : MonoBehaviour
{
public void StartGame()
{
// Application.LoadLevel("Stage1");
SceneManager.LoadScene("Stage1");
}
}
最后一步:我们为按钮写个脚本。
在你按钮的"OnClick()"列表里
- 使用"+"按钮增加一个新的监听
- 拖动"Scripts"对象到这个新加行上
- 将调用方法设置为
MenuScript.StartGame()
然后,运行游戏,看看你的漂亮菜单吧:
点击Play!...崩溃!
译者注:在Unity 2018.3里这里并没有崩溃。所以,下面关于这个崩溃的处理,只需了解一下
Level 'Stage1' (-1) couldn't be loaded because it has not been added to the build settings. To add a level to the build settings use the menu File->Build Settings...
我们要做什么,错误信息里已经写清楚了。
打开"File" -> "Build Settings":
把需要的场景都添加进去,我们这里是:"Menu"和"Stage1"
回到菜单界面,点击Play!
小巧门:SceneManager.LoadScene()方法的作用是在当前的场景里实例化另一个场景里的所有对象。有时,你想从第一个场景保留一个游戏对象到下一个场景 (举个例子,在两个菜单点不间断的音乐),Unity为这个提供了
DontDestroyOnLoad(aGameObject)
方法,用它调用一个游戏对象,那么这个游戏对象将不会在新场景被加载时销毁。事实上,它将不会再被任何场景销毁。所以,如果你想删除它,你需要手动处理。
通常,我们将允许玩家一旦死亡后,可以重新开始游戏。正如你看到的,它经常发生 (我们将在即将到来的章节,让游戏更简单点)
我们的游戏将像下面这样:
- 玩家被子弹打中
- 调用
HealthScript.OnCollisionEnter
- 玩家失败1点生命值
HealthScript
将在玩家生命值少于1的时候摧毁他
我们将增加两步:
- 调用
PlayerScript.OnDestroy
- 创建一个"GameOverScript"并添加到场景中
在"Scripts"目录里添加"GameOverScript"。
它将只有一点代码,包含"Restart"和"Back to Menu"按钮:
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManager;
/// <summary>
/// Start or quit the game
/// </summary>
public class GameOverScript : MonoBehaviour
{
private Button[] buttons;
void Awake()
{
// Get the buttons
buttons = GetComponentsInChildren<Button>();
// Disable them
HideButtons();
}
public void HideButtons()
{
foreach (var b in buttons)
{
b.gameObject.SetActive(false);
}
}
public void ShowButtons()
{
foreach (var b in buttons)
{
b.gameObject.SetActive(true);
}
}
public void ExitToMenu()
{
// Reload the level
// Application.LoadLevel("Menu");
SceneManager.LoadScene("Menu");
}
public void RestartGame()
{
// Reload the level
// Application.LoadLevel("Stage1");
SceneManager.LoadScene("Stage1");
}
}
我们同样需要一些UI组件。
- 在"Stage1"场景,创建一个"Panel"
- 移除"Source Image",将颜色设置为是白色且全透明
- 添加两个按钮到panel里
- 添加"GameOverScript"到panel里
为每个按钮:
- 添加"OnClick()"事件,将Panel拖到事件里
- 在"GameOverScript"里选择适用的方法
举个例子,"Back to menu"按钮:
接下来,在"PlayerScript"里,我们必须在死亡时调用这个脚本:
void OnDestroy()
{
// Game Over.
var gameOver = FindObjectOfType<GameOverScript>();
gameOver.ShowButtons();
}
运行游戏,试着去死 (应该要不了多久):
当然,它可以添加点分数和动画,加强一下效果,举个例子。
咯,并没有!:)
我们刚刚学习了如果在游戏里添加菜单。
看看到现在,你都完成了什么:
- 一个使用3张背景层的视差滚动
- 一些粒子
- 标题界面
- 图像和声音
- 一个shmup 横版卷轴射击游戏,一个玩家,多个敌人
恭喜啊!但,不幸的是,它只是在你的电脑上,要销售这款获奖游戏,我们需要发布它。
这就是我们将在最后一章要讲的东西:发布。